package com.shujia.base.day03

import scala.io.Source

/**
 *  读取文件scala/data/words.txt，计算每个单词的数量
 */
object Demo22WordCount {
  def main(args: Array[String]): Unit = {
    //1、读取数据文件
//    val source = Source.fromFile("scala/data/words.txt")
//    //2、获取所有行数据，封装在了一个迭代器中
//    val lines = source.getLines()
//    //3、将迭代器中的元素放到List集合中
//    val lineList:List[String] = lines.toList
//    println(lineList)

    val lineList:List[String] = Source.fromFile("scala/data/words.txt").getLines().toList
    println(lineList)
    //4、对每一个元素进行扁平化
    val wordList:List[String] = lineList.flatMap((e: String) => e.split(" "))
    println(wordList)
    //5、对同一个单词进行分组
    val wordMap:Map[String,List[String]] = wordList.groupBy((e: String) => e)
    println(wordMap)

    /*
        分完组后：
          Map((peach,List(peach, peach)), (world,List(world, world, world)))

        思路：对Map中每一个元素进行处理，Map中每一个元素是一个键值对。
        解决方案：调用高阶函数map对每个元素进行处理

        目标数据格式：
          Map((peach,2), (world,3))

        word,number
     */
    val wordNumMap:Map[String,Int] = wordMap.map((kv: (String, List[String])) => {
      val word = kv._1
      val number = kv._2.size
      (word, number)
    })
    println(wordNumMap)

    //遍历结果
    for(kv<-wordNumMap){
      println(kv._1+","+kv._2)
    }

    println("="*50)
    /**
     *  使用链式调用总结代码
     */

    Source.fromFile("scala/data/words.txt").getLines().toList
      .flatMap(_.split(" "))
      .groupBy(e=>e)
      .map((kv: (String, List[String])) => (kv._1, kv._2.size))
      .foreach(println)



  }
}
